/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __014CA97F_0CCB_4978_AAEB_EEAE5B1F61D2__
#define __014CA97F_0CCB_4978_AAEB_EEAE5B1F61D2__

#include "../tools/head.h"

/////////////////////////////////////////////////////////////////////////////////////////
// 
namespace xos_box
{
    class big_buf_impl;
    class buf_impl;

    // 
    // msg interface
    // 
    class msg_impl : public xos_stl::mem_item< xos::release_impl<msg_impl>, thread_lock >,
        public i_msg
    {
    public:
        typedef xos::release_impl<msg_impl> T;

    public:
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //
        static int get_xos_item_data( ITEM_DATA *& item_ptr );

    public:
        msg_impl();
        ~msg_impl();

    public:
        // 
        // additional variable
        // 
        xos::f_runnable m_lpRun[EXTRA_PARAM_NUM];
        big_buf_impl * m_lpBigBuf[EXTRA_PARAM_NUM];
        buf_impl * m_lpBuf[EXTRA_PARAM_NUM];
        std::string m_strs[EXTRA_PARAM_NUM];
        void * m_lpData[EXTRA_PARAM_NUM];
        double m_dlData[EXTRA_PARAM_NUM];
        int m_nData[EXTRA_PARAM_NUM];
        int m_nMsg[EXTRA_PARAM_NUM];
        int64_t m_i64[EXTRA_PARAM_NUM];
        bool m_bData[EXTRA_PARAM_NUM];

    public:
        int init();
        int term();

    public:
        //////////////////////////////////////////////////////////////////////////////////////
        // 
        // data member
        //

        // 
        // string
        // 
        const char * get_str( int nIndex, char * lpszStr, int nSize, int * lpnLenNeeded );
        int set_str( int nIndex, const char * lpszStr );

        // 
        // xos_box::i_big_buf
        // 
        xos_box::i_big_buf * get_big_buf( int nIndex, xos_box::i_big_buf ** lppBigBuf );
        int set_big_buf( int nIndex, xos_box::i_big_buf * lpBigBuf );

        // 
        // xos_box::i_buf
        // 
        xos_box::i_buf * get_buf( int nIndex, xos_box::i_buf ** lppBuf );
        int set_buf( int nIndex, xos_box::i_buf * lpBuf );

        // 
        // double
        // 
        double get_double( int nIndex, double * lpdlData );
        int set_double( int nIndex, double dlData );

        // 
        // void *
        // 
        void * get_void( int nIndex, void ** lppData );
        int set_void( int nIndex, void * lpData );

        // 
        // int
        // 
        int get_int( int nIndex, int * lpnInt );
        int set_int( int nIndex, int nInt );

        // 
        // int64_t
        // 
        int64_t get_i64( int nIndex, int64_t * lpi64 );
        int set_i64( int nIndex, int64_t i64 );

        // 
        // bool
        // 
        bool get_bool( int nIndex, bool * lpBool );
        int set_bool( int nIndex, bool bBool );

        // 
        // runnable
        // 
        xos::f_runnable get_runnable( int nIndex, xos::f_runnable * lpRun );
        int set_runnable( int nIndex, xos::f_runnable lpRun );

        // 
        // msg
        // 
        int get_msg( int nIndex, int * lpnInt );
        int set_msg( int nIndex, int nInt );

        //////////////////////////////////////////////////////////////////////////////////////
        // 

        // 
        // 因为太经常用了，所以加两对方法支持一下
        // 
        int set_msg_type( int nType );
        int set_msg( int nMsg );
        int get_msg_type();
        int get_msg();

        //////////////////////////////////////////////////////////////////////////////////////
        // 
    protected:
        int normalize_index( int nIndex );

    };
}

#endif // __014CA97F_0CCB_4978_AAEB_EEAE5B1F61D2__
